import numpy as np
import pandas as pd
from datetime import datetime
import os


def prepare_Y():
    vad = pd.read_excel("data/GDPdata/19行业现价GDP2004-2024.xlsx",
    sheet_name="data",
    index_col=0).T
    vad.columns = [s.year for s in vad.columns]
    return vad

def calculate_depreciation_rate(depreciation_years, residual_rate):
    """
    根据折旧年限和残值率，计算直线法（平均年限法）的折旧率
    
    参数:
    depreciation_years (float/int): 折旧年限
    residual_rate (float): 残值率，取值范围0-1
    
    返回:
    float: 年折旧率
    
    计算方法:
    年折旧率 = (1 - 残值率) / 折旧年限
    """
    # 验证输入参数的有效性
    if not isinstance(depreciation_years, (int, float)) or depreciation_years <= 0:
        raise ValueError("折旧年限必须是大于0的数字")
    
    if not isinstance(residual_rate, (int, float)) or residual_rate < 0 or residual_rate >= 1:
        raise ValueError("残值率必须是0到1之间的数字")
    
    # 计算折旧率
    depreciation_rate = (1 - residual_rate) / depreciation_years
    
    return depreciation_rate


def calculate_depreciation_rate_multiple_methods(depreciation_years, residual_rate, method='straight_line'):
    """
    根据折旧年限、残值率和折旧方法，计算折旧率
    
    参数:
    depreciation_years (float/int): 折旧年限
    residual_rate (float): 残值率，取值范围0-1
    method (str): 折旧方法，支持'straight_line'(直线法)、'double_declining'(双倍余额递减法)、'geometric'(几何模式/指数折旧法)
    
    返回:
    float: 年折旧率
    """
    # 验证输入参数的有效性
    if not isinstance(depreciation_years, (int, float)) or depreciation_years <= 0:
        raise ValueError("折旧年限必须是大于0的数字")
    
    if not isinstance(residual_rate, (int, float)) or residual_rate < 0 or residual_rate >= 1:
        raise ValueError("残值率必须是0到1之间的数字")
    
    # 根据不同的折旧方法计算折旧率
    if method == 'straight_line':
        # 直线法
        depreciation_rate = (1 - residual_rate) / depreciation_years
    elif method == 'double_declining':
        # 双倍余额递减法（加速折旧法）
        # 双倍余额递减法的年折旧率 = 2 / 折旧年限
        # 注意：双倍余额递减法的年折旧率不考虑残值率，但在最后两年需要调整
        depreciation_rate = 2 / depreciation_years
    elif method == 'geometric':
        # 几何模式（指数折旧法）
        # 几何模式下，资产价值按固定比例递减
        # 年折旧率 = 1 - (残值率)^(1/折旧年限)
        depreciation_rate = 1 - residual_rate ** (1 / depreciation_years)
    else:
        raise ValueError("不支持的折旧方法，请使用'straight_line'、'double_declining'或'geometric'")
    
    return depreciation_rate


def calculate_geometric_depreciation_rate(depreciation_years, residual_rate):
    """
    根据折旧年限和残值率，计算几何模式（指数折旧法）下的折旧率
    
    参数:
    depreciation_years (float/int): 折旧年限
    residual_rate (float): 残值率，取值范围0-1
    
    返回:
    float: 年折旧率
    
    计算方法:
    年折旧率 = 1 - (残值率)^(1/折旧年限)
    
    说明:
    在几何模式下，资产价值按照固定比例逐年递减，即V(t) = V(0) * (1 - 折旧率)^t
    当t=折旧年限时，V(t) = V(0) * 残值率
    """
    # 验证输入参数的有效性
    if not isinstance(depreciation_years, (int, float)) or depreciation_years <= 0:
        raise ValueError("折旧年限必须是大于0的数字")
    
    if not isinstance(residual_rate, (int, float)) or residual_rate < 0 or residual_rate >= 1:
        raise ValueError("残值率必须是0到1之间的数字")
    
    # 计算几何模式下的折旧率
    depreciation_rate = 1 - residual_rate ** (1 / depreciation_years)
    
    return depreciation_rate


if __name__ == '__main__':
    # 测试calculate_depreciation_rate函数
    ## 建筑按照工程 55 年 残值率 5%
    print(calculate_depreciation_rate_multiple_methods(28, 0.05, method='geometric'))  # 输出:
    # 设备工器具购置 16 年 残值率 5%
    print(calculate_depreciation_rate_multiple_methods(16, 0.05, method='geometric'))  # 输出: